package com.ruoyi.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.dto.ItemAddDTO;
import com.ruoyi.system.dto.ItemUpdateDTO;
import com.ruoyi.system.dto.ItemCompleteDTO;
import com.ruoyi.system.dto.ConstructionProjectItemDTO;
import com.ruoyi.system.entity.ConstructionProjectItemDO;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 施工事项管理Service接口
 */
public interface IConstructionItemService extends IService<ConstructionProjectItemDO> {

    /**
     * 根据阶段ID获取事项列表
     * @param stageId 阶段ID
     * @return 事项列表
     */
    List<ConstructionProjectItemDTO> getItemsByStageId(Long projectId, Long stageId);

    /**
     * 新增施工事项
     * @param itemAddDTO 新增事项DTO
     * @return 是否新增成功
     */
    boolean addItem(ItemAddDTO itemAddDTO);

    /**
     * 删除施工事项
     * @param itemId 事项ID
     * @return 是否删除成功
     */
    boolean deleteItem(Long itemId);

    /**
     * 检查阶段是否有未完成事项
     * @param stageId 阶段ID
     * @return 是否有未完成事项
     */
    boolean hasUnfinishedItems(Long projectId, Long stageId);

    /**
     * 修改施工事项
     */
    boolean updateItem(ItemUpdateDTO itemUpdateDTO);

    /**
     * 手动完工施工事项
     * @param itemCompleteDTO 完工参数
     * @return 是否完工成功
     */
    boolean completeItem(ItemCompleteDTO itemCompleteDTO);

    /**
     * 今日待跟进事项（completion_status < 2 且 end_time = today）
     * @param projectId 可选项目ID筛选，null 表示全部
     * @param today 业务口径上的“今天”（便于单元测试与可控查询）
     */
    List<ConstructionProjectItemDTO> listTodayPendingFollowUps(Long projectId, LocalDate today);

    /**
     * 超期未跟进事项（completion_status < 2 且 end_time < today）
     * @param projectId 可选项目ID筛选，null 表示全部
     * @param today 基准“今天”
     */
    List<ConstructionProjectItemDTO> listOverduePendingFollowUps(Long projectId, LocalDate today);

    /**
     * 超期预警事项：距截止日期N天内(>0)且未完成
     * 规则：completion_status < 2 且 today <= end_time <= today+days
     * @param projectId 可选项目ID
     * @param today 基准日期
     * @param days 预警天数，默认7
     */
    List<ConstructionProjectItemDTO> listDueSoonPendingFollowUps(Long projectId, LocalDate today, int days);

    /**
     * 日历：当月每日待办数量汇总
     * 规则：与当月区间有交集且未完成(completion_status < 2)
     * 返回：key=yyyy-MM-dd, value=count
     */
    Map<String, Integer> calendarSummary(LocalDate month);

    /**
     * 日历：指定日期的待办事项列表
     * 规则：start_time <= date <= end_time 且 未完成
     */
    List<ConstructionProjectItemDTO> calendarTodos(LocalDate date, Long projectId);
}